"""图片转换器模块
功能：将各种格式图片转换为JPG格式，并可选择调整尺寸
特性：
  1. 只输入宽度或高度时，会按照原始图片的长宽比自动计算另一个维度
  2. 当输入尺寸大于或等于原尺寸时，保持原尺寸不变
  3. 同时指定宽度和高度时，直接使用指定尺寸，不保持原图片比例
"""

import os
from PIL import Image

# 定义模块的公共接口
__all__ = ['convert_to_jpg']


def convert_to_jpg(input_path, output_path=None, width=None, height=None, quality=90):
    """
    将图片转换为JPG格式，并可选择调整尺寸
    
    参数:
        input_path (str): 输入图片路径
        output_path (str): 输出图片路径，默认为None（在原文件名基础上添加_jpg后缀）
        width (int): 输出图片的宽度，默认为None（保持原尺寸）。只指定此项时会按比例计算高度
        height (int): 输出图片的高度，默认为None（保持原尺寸）。只指定此项时会按比例计算宽度
        quality (int): JPG质量（1-95），默认为80
    
    返回:
        str: 输出图片的路径
    """
    try:
        # 打开图片
        img = Image.open(input_path)
        
        # 如果输出路径未指定，在原文件名基础上修改
        if output_path is None:
            base_name = os.path.splitext(input_path)[0]
            output_path = f"{base_name}_converted.jpg"
        else:
            # 确保输出路径有.jpg扩展名
            if not output_path.lower().endswith('.jpg') and not output_path.lower().endswith('.jpeg'):
                output_path += '.jpg'
        
        # 调整图片尺寸（如果指定了宽度或高度）
        if width or height:
            # 获取原始尺寸
            orig_width, orig_height = img.size
            new_size = (orig_width, orig_height)
            
            # 加调试信息，输出原始尺寸和指定的宽度/高度
            print(f'原始尺寸: {orig_width}x{orig_height}, 指定尺寸: {width}x{height}')
            # 计算新尺寸
            if (width and width < orig_width) or (height and height < orig_height):
                # 至少有一个维度需要缩小
                if width and height:
                    # 同时指定了宽度和高度，直接使用指定尺寸（不保持比例）
                    new_size = (width, height)
                elif width:
                    # 只指定宽度，按比例计算高度
                    ratio = width / orig_width
                    new_size = (width, int(orig_height * ratio))
                elif height:
                    # 只指定高度，按比例计算宽度
                    ratio = height / orig_height
                    new_size = (int(orig_width * ratio), height)
                
                # 执行调整操作
                img = img.resize(new_size, Image.LANCZOS)
        
        # 转换为RGB模式（处理透明背景的图片）
        if img.mode == 'RGBA':
            background = Image.new('RGB', img.size, (255, 255, 255))
            background.paste(img, mask=img.split()[3])  # 3 is the alpha channel
            img = background
        elif img.mode != 'RGB':
            img = img.convert('RGB')
        
        # 保存为JPG格式
        img.save(output_path, 'JPEG', quality=quality)
        
        return output_path
        
    except Exception as e:
        # 转换图片时出错: {str(e)}
        raise